import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import rcParams
import matplotlib.font_manager as fm
from sklearn.preprocessing import StandardScaler

# 设置Matplotlib使用Agg后端（非GUI）
import matplotlib

matplotlib.use('Agg')

# 步骤 1：设置Matplotlib支持中文字体
# 使用SimHei字体（你可以根据需要更改字体路径）
font_path = 'C:/Windows/Fonts/simhei.ttf'  # 这是Windows系统上的SimHei字体路径，其他系统可能不同
prop = fm.FontProperties(fname=font_path)

# 设置字体为SimHei
rcParams['font.family'] = prop.get_name()

# 禁止负号显示为方块
rcParams['axes.unicode_minus'] = False

# 步骤 2：加载数据
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data"
columns = ['Class', 'Alcohol', 'Malic_acid', 'Ash', 'Alcalinity_of_ash', 'Magnesium',
           'Total_phenols', 'Flavanoids', 'Nonflavanoid_phenols', 'Proanthocyanins',
           'Color_intensity', 'Hue', 'OD280/OD315', 'Proline']
data = pd.read_csv(url, header=None, names=columns)

# 步骤 3：筛选类别 1 和类别 2 的数据
filtered_data = data[data['Class'].isin([1, 2])]
X = filtered_data.iloc[:, 1:]  # 特征数据

# 步骤 4：数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)


# 步骤 5：初始化K-Means算法
def kmeans(X, k=2, max_iters=100):
    # 随机初始化K个聚类中心
    centroids = X[np.random.choice(X.shape[0], k, replace=False)]
    prev_centroids = np.zeros_like(centroids)
    labels = np.zeros(X.shape[0])

    # 迭代直到聚类中心不再变化
    for _ in range(max_iters):
        # 步骤 6：为每个点分配最近的中心
        for i in range(X.shape[0]):
            distances = np.linalg.norm(X[i] - centroids, axis=1)
            labels[i] = np.argmin(distances)

        # 步骤 7：更新聚类中心
        for i in range(k):
            centroids[i] = X[labels == i].mean(axis=0)

        # 如果聚类中心没有变化，停止迭代
        if np.all(centroids == prev_centroids):
            break
        prev_centroids = centroids.copy()

    return centroids, labels


# 步骤 6：运行K-Means算法
centroids, labels = kmeans(X_scaled, k=2)

# 步骤 7：可视化聚类结果
plt.figure(figsize=(8, 6))

# 绘制聚类结果
plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=labels, cmap='viridis', edgecolor='k', s=50)

# 绘制聚类中心
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', marker='X', s=200, label='聚类中心')

# 添加标题和标签
plt.title('K-Means 聚类结果')
plt.xlabel('酒精含量 (Alcohol)')
plt.ylabel('苹果酸含量 (Malic acid)')

# 显示图例
plt.legend()

# 保存图像到文件
plt.savefig('kmeans_wine.png')



